from django.contrib.auth.models import Permission, Group
from django.contrib.contenttypes.models import ContentType
from rest_framework.decorators import action
from rest_framework.permissions import IsAdminUser
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from meiduo_admin.serializers.permissions import PermissionSerializer, ContentTypeSerializer, GroupSerializer, \
    PermSimpleSerializer, AdminSerializer, GroupSimpleSerializer
from users.models import User


class PermissionViewSet(ModelViewSet):
    """
    请求方式： GET /meiduo_admin/permission/perms/
    请求参数： 通过请求头传递jwt token数据。
    返回数据： JSON
    {
        "counts": "权限总数量",
        "lists": [
            {
                "id": "权限id",
                "name": "权限名称",
                "codename": "权限识别名",
                "content_type": "权限类型ID"
            },
            ...
        ],
        "page": "当前页码",
        "pages": "总页码",
        "pagesize": "页容量"
    }
    """
    # 仅管理员才能进行访问
    permissions_classes = [IsAdminUser]

    # 指定视图所使用的查询集
    queryset = Permission.objects.all()

    # 指定视图所使用的序列化器
    serializer_class = PermissionSerializer

    # 指定router动态生成路由时,提取参数的正则表达式
    lookup_value_regex = '\d+'

    # 获取权限表数据 GET /meiduo_admin/permission/perms/ -> list
    # 新增(保存)权限数据 POST /meiduo_admin/permission/perms/ -> create
    # 思考：为什么指定权限数据的获取、修改、删除不需要实现,直接使用即可???
    # 指定数据获取 GET /meiduo_admin/permission/perms/(?P<pk>\d+)/ -> retrieve
    # 指定数据修改 PUT /meiduo_admin/permission/perms/(?P<pk>\d+)/ -> update
    # 指定数据删除 DELETE /meiduo_admin/permission/perms/(?P<pk>\d+)/ -> destroy
    # 获取权限类型数据 GET /meiduo_admin/permission/content_types/ -> content_types

    # def list(self, request, *args, **kwargs):
    #     queryset = self.get_queryset()
    #     serializer = self.get_serializer(queryset, many=True)
    #     return Response(serializer.data)

    # POST请求时,会调用PermissionViewSet视图集中的create方法,已经满足这里的需要,直接使用即可
    # def create(self, request, *args, **kwargs):
    #     serializer = self.get_serializer(data=request.data)
    #     serializer.is_valid(raise_exception=True)
    #     serializer.save() # 调用序列化器类中的create
    #     return Response(serializer.data, status=201)

    # @action(methods=['get'], detail=False)
    def content_types(self, request):
        """
        获取权限类型数据：
        1. 查询数据库获取权限类型数据
        2. 将权限类型数据序列化并返回
        """
        # 1. 查询数据库获取权限类型数据
        content_types = ContentType.objects.all()

        # 2. 将权限类型数据序列化并返回
        serializer = ContentTypeSerializer(content_types, many=True)
        return Response(serializer.data)


class GroupViewSet(ModelViewSet):
    """
    返回数据： JSON
    {
        "counts": "用户组总数量",
        "lists": [
            {
                "id": "组id",
                "name": "组名称",
                "permissions": ["权限id", ...]
            },
            ...
        ],
        "page": "当前页码",
        "pages": "总页码",
        "pagesize": "页容量"
    }
    """
    permission_classes = [IsAdminUser]

    # 指定视图所使用的查询集
    queryset = Group.objects.all()
    # 指定视图所使用的序列化器类
    serializer_class = GroupSerializer

    # 指定router动态生成路由时,提取参数的正则表达式
    lookup_value_regex = '\d+'

    # 获取用户组数据 GET /meiduo_admin/permission/groups/ -> list
    # 新增(保存)用户组数据 POST /meiduo_admin/permission/groups/ -> create
    # 获取指定用户组数据 GET /meiduo_admin/permission/groups/(?P<pk>\d+)/ -> retrieve
    # 修改指定用户组数据 PUT /meiduo_admin/permission/groups/(?P<pk>\d+)/ -> update
    # 删除指定用户组数据 DELETE /meiduo_admin/permission/groups/(?P<pk>\d+)/ -> destroy
    # 获取权限简单数据 GET /meiduo_admin/permission/simple/ -> simple

    # def list(self, request, *args, **kwargs):
    #     queryset = self.get_queryset()
    #     serializer = self.get_serializer(queryset, many=True)
    #     return Response(serializer.data)

    # def create(self, request, *args, **kwargs):
    #     serializer = self.get_serializer(data=request.data)
    #     serializer.is_valid(raise_exception=True)
    #     serializer.save() # 调用序列化器类中的create
    #     return Response(serializer.data, status=201)

    def simple(self, request):
        """
        获取权限的简单数据:
        ①查询数据库获取所有权限的数据
        ②将权限的数据序列化并返回
        """
        # 查询数据库获取所有权限的数据
        perms = Permission.objects.all()

        # 将权限的数据序列化并返回
        serializer = PermSimpleSerializer(perms, many=True)
        return Response(serializer.data)


class AdminViewSet(ModelViewSet):
    """
    请求方式： GET /meiduo_admin/permission/admins/
    请求参数： 通过请求头传递jwt token数据。
    返回数据： JSON
    {
        "id": "用户id",
        "username": "用户名",
        "email": "邮箱",
        "mobile": "手机号",
        "groups": ["用户组id", ...],
        "user_permissions": ["权限id", ...]
    }
    """
    # 仅限管理员访问
    permission_classes = [IsAdminUser]

    # 指定视图所使用的查询集
    # is_staff默认False,普通用户,如果is_staff为True的用户是管理员用户
    queryset = User.objects.filter(is_staff=True)

    # 指定视图所使用的序列化器类
    # serializer_class = '管理员用户序列化器类'
    serializer_class = AdminSerializer

    # 指定router动态生成路由时,提取参数的正则表达式
    lookup_value_regex = '\d+'

    # 获取管理员用户数据 GET /meiduo_admin/permission/admins/ -> list
    # 保存管理员数据 POST /meiduo_admin/permission/admins/ -> create
    # 指定管理员数据获取 GET /meiduo_admin/permission/admins/(?P<pk>\d+)/ -> retrieve
    # 指定管理员数据修改 PUT /meiduo_admin/permission/admins/(?P<pk>\d+)/ -> update
    # 指定管理员数据删除 DELETE /meiduo_admin/permission/admins/(?P<pk>\d+)/ -> destroy
    # 获取用户组简单数据 GET /meiduo_admin/permission/groups/simple/ -> simple

    # def list(self, request, *args, **kwargs):
    #     queryset = self.get_queryset()
    #     serializer = self.get_serializer(queryset, many=True)
    #     return Response(serializer.data)

    # def create(self, request, *args, **kwargs):
    #     serializer = self.get_serializer(data=request.data)
    #     serializer.is_valid(raise_exception=True)
    #     serializer.save() # 调用序列化器类中的create
    #     return Response(serializer.data, status=201)

    # def update(self, request, *args, **kwargs):
    #     instance = self.get_object()
    #     serializer = self.get_serializer(instance, data=request.data)
    #     serializer.is_valid(raise_exception=True)
    #     serializer.save() # 调用序列化器类中的update
    #     return Response(serializer.data)

    def simple(self, request):
        """获取用户组简单数据
        1.查询数据库获取所有用户组数据
        2.将用户组数据序列化并返回
        """
        # 1.查询数据库获取所有用户组数据
        groups = Group.objects.all()

        # 2.将用户组数据序列化并返回
        serializer = GroupSimpleSerializer(groups, many=True)
        return Response(serializer.data)
